package com.supermap.wzhy.common.api;

import com.supermap.wzhy.data.OpStatus;
import com.supermap.wzhy.data.MacroFinalInfo;
import com.supermap.wzhy.data.PageInfo;
import com.supermap.wzhy.data.cons.SysConstant;
import com.supermap.wzhy.entity.*;
import org.springframework.data.domain.PageRequest;
import org.springframework.util.Assert;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * Controller基础类
 * <p>
 * 说明：此类存在公共的处理request/session/upload/OpStatus/等方法，<br/>
 * 继承此类的Controller都拥有这些方法
 * </p>
 *
 * @author Created by W.Hao on 14-2-11.
 *
 */
public class BaseController {

    /** SGIS4.0上传文件本地磁盘上传统一路径 */
    public static String uploadFilePath = MacroFinalInfo.userHome;

    // static {
    // String path =
    // ConfigHelper.get(MacroFinalInfo.userHome);//获取data工程config.properties配置
    // if(null != path&&!path.equals("")){
    // uploadFilePath = path ;
    // }
    // }

    /**
     * session中获取当前登录的用户
     *
     * @param request
     *            http 请求
     *
     * @return 当前请求的用户信息，未登录，则返回null
     */
    public TUsers getSessionUser(HttpServletRequest request) {
        return (TUsers) request.getSession().getAttribute(
                SysConstant.CURRENT_USER);
    }

    /**
     * 保存当前用户到session
     *
     * @param request
     *            http 请求
     * @param user
     *            用户信息
     */
    public void setSessionUser(HttpServletRequest request, TUsers user) {
        request.getSession().setAttribute(SysConstant.CURRENT_USER, user);
    }

    /**
     * 删除session里的用户信息
     *
     * @param request
     *            http 请求
     */
    public void removeSessionUser(HttpServletRequest request) {
        request.getSession().removeAttribute(SysConstant.CURRENT_USER);
    }

    /**
     * 获取session中当前登录用户所有专业（多个）
     *
     * @param request
     *            http 请求
     * @return 当前请求用户的所有专业列表，未登录则返回null
     */
    public List<TUsermajor> getSessionMajors(HttpServletRequest request) {
        return (List<TUsermajor>) request.getSession().getAttribute(
                SysConstant.CURRENT_USRERMAJORS);
    }

    /**
     * 设置当前用户所有专业到session（多个）
     *
     * @param request
     *            http 请求
     * @param mojors
     *            专业组
     */
    public void setSessionMajors(HttpServletRequest request,
                                 List<TUsermajor> mojors) {
        request.getSession().setAttribute(SysConstant.CURRENT_USRERMAJORS,
                mojors);
    }

    /**
     * 删除当前用户session里的专业信息（多个）
     *
     * @param request
     *            http 请求
     */
    public void removeSessionMajors(HttpServletRequest request) {
        request.getSession().removeAttribute(SysConstant.CURRENT_USRERMAJORS);
    }

    /**
     * 获取当前登录用户所有角色（多个）
     *
     * @param request
     *            http 请求
     * @return 当前请求用户的所有角色列表，未登录则返回null
     */
    public List<TUserrole> getSessionRoles(HttpServletRequest request) {
        return (List<TUserrole>) request.getSession().getAttribute(
                SysConstant.CURRENT_USRERROLES);
    }

    /**
     * 设置当前用户所有角色到session（多个）
     *
     * @param request
     *            http 请求
     * @param userroles
     *            角色组
     */
    public void setSessionRoles(HttpServletRequest request,
                                List<TUserrole> userroles) {
        request.getSession().setAttribute(SysConstant.CURRENT_USRERROLES,
                userroles);
    }

    /**
     * 删除当前用户session里的角色信息（多个）
     *
     * @param request
     *            http 请求
     */
    public void removeSessionRoles(HttpServletRequest request) {
        request.getSession().removeAttribute(SysConstant.CURRENT_USRERROLES);
    }

    /**
     * 获取当前登录用户所有系统权限（不包括数据权限）
     * <p style="color:red;">
     * 注意：只包括系统的权限，不包括数据权限
     * </p>
     *
     * @param request
     *            http 请求
     * @return 当前请求用户的所有权限列表，未登录则返回null
     */
    public List<TUserpower> getSessionPowers(HttpServletRequest request) {
        return (List<TUserpower>) request.getSession().getAttribute(
                SysConstant.CURRENT_POWERS);
    }

    /**
     * 设置当前用户所有系统权限到session（不包括数据权限）
     * <p style="color:red;">
     * 注意：只包括系统的权限，不包括数据权限
     * </p>
     *
     * @param request
     *            http 请求
     * @param powers
     *            权限组
     */
    public void setSessionPowers(HttpServletRequest request,
                                 List<TUserpower> powers) {
        request.getSession().setAttribute(SysConstant.CURRENT_POWERS, powers);
    }

    /**
     * 删除当前用户session里的系统权限信息（不包括数据权限）
     * <p style="color:red;">
     * 注意：只包括系统的权限，不包括数据权限
     * </p>
     *
     * @param request
     *            http 请求
     */
    public void removeSessionPowers(HttpServletRequest request) {
        request.getSession().removeAttribute(SysConstant.CURRENT_POWERS);
    }

    /**
     * 获取一个URL的绝对路径
     *
     * @param request
     *            http 请求
     * @param url
     *            url的子路径
     * @return URL的绝对路径
     */
    public final String getAbsoluteUrl(HttpServletRequest request, String url) {
        Assert.hasLength(url, "url不能为空");
        Assert.isTrue(url.startsWith("/"), "必须以/开头");
        return request.getContextPath() + url;
    }

    /**
     * 取得上传的文件的保存路劲
     *
     * @return 文件的保存路劲
     */
    public final String getUploadPath() {
        return uploadFilePath;
    }

    /**
     * 二元状态返回
     *
     * @param status
     *            true or false
     * @return 操作状态结果
     */
    public OpStatus getOpStatus(boolean status) {
        return status ? ok() : fail();
    }

    /**
     * 取得操作成功状态结果
     *
     * @return 操作成功状态结果
     */
    public OpStatus ok() {
        return new OpStatus();
    }

    /**
     * 取得操操作失败结果
     *
     * @return
     */
    public OpStatus fail() {
        return new OpStatus(false, "操作失败", null);
    }

    /**
     * 组装分页和排序
     *
     * @param page
     *            分页信息
     * @return 分页请求对象
     */
    public PageRequest getPageRequest(PageInfo page) {
        if (page == null) {
            page = new PageInfo();
        }
        return new PageRequest(page.getPageNumber(), page.getPageSize());
    }

    /**
     * 从session中获取当前用户所属的行政区划
     *
     * @param request
     *            http 请求
     * @return 当前用户行政区划编码，未登录，则返回""
     */
    public String getUserRegionCode(HttpServletRequest request) {
        TUsers user = getSessionUser(request);
        // 没有获取到用户信息
        if (null == user) {
            return "";
        }
        String region = user.getUserRegion();
        if (null == region || region.equals("")) {
            return "";
        }
        String code = region.split("@")[1];
        return code;
    }

    /**
     * 取得登录用户的id
     *
     * @param request
     *            http 请求
     * @return -1 代表获取失败
     */
    protected int getLoginUserId(HttpServletRequest request) {
        TUsers tUsers = getSessionUser(request);
        if (tUsers != null) {
            return tUsers.getUserid();
        }
        return -1;
    }

    /**
     * 取得当前用户的sessionid
     *
     * @param request
     *            http 请求
     * @return sessionid
     */
    protected String getSessionId(HttpServletRequest request) {

        return request.getSession().getId();
    }
}
